//package keer.httpinterface.http;
//
//import keer.httpinterface.annotation.Arg;
//import keer.httpinterface.utils.ClassUtils;
//import keer.httpinterface.utils.CollectionUtils;
//import keer.httpinterface.utils.StringUtils;
//
//import java.lang.reflect.Array;
//import java.lang.reflect.Field;
//import java.lang.reflect.Modifier;
//import java.nio.charset.StandardCharsets;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * http请求参数集合
// *
// * @author Keer
// * @since 1.0.0
// */
//@SuppressWarnings("rawtypes")
//public class Params {
//    private final Map<String, Object[]> paramMap;
//
//    /**
//     * 构造函数, 创建一个空的参数集合
//     */
//    public Params() {
//        this(null);
//    }
//
//    /**
//     * 构造函数, 创建一个参数集合, 并复制参数集合
//     * @param params 源参数集合
//     */
//    public Params(Params params) {
//        paramMap = new HashMap<>();
//        if (params != null) {
//            paramMap.putAll(params.paramMap);
//        }
//    }
//
//    /**
//     * 返回所有的参数集合
//     * @return 参数集合
//     */
//    public Map<String, Object[]> allParameters() {
//        return Collections.unmodifiableMap(paramMap);
//    }
//
//    /**
//     * 返回指定参数的数组
//     * @param key 参数名称
//     * @return 参数值数组
//     */
//    public Object[] getParameters(String key) {
//        return paramMap.get(key);
//    }
//
//    /**
//     * 返回指定参数的值, 如果参数不存在, 则返回null,如果存在多个参数, 则返回第一个参数的值
//     * @param key 参数名称
//     * @return 参数值
//     */
//    public Object getParameter(String key) {
//        Object[] ret = paramMap.get(key);
//        if (ret == null || ret.length == 0) {
//            return null;
//        }
//        return ret[0];
//    }
//
//    /**
//     * 添加参数, 如果参数已经存在, 则添加到参数数组中
//     * @param key 参数名称
//     * @param value 参数值
//     */
//    public void addParameter(String key, Object... value) {
//        if (value.length > 0) {
//            Object[] values = paramMap.get(key);
//            if (values == null) {
//                values = new Object[0];
//            }
//            Object[] tmp = new Object[values.length + value.length];
//            System.arraycopy(values, 0, tmp, 0, values.length);
//            System.arraycopy(value, 0, tmp, values.length, value.length);
//            paramMap.put(key, tmp);
//        }
//    }
//
//    /**
//     * 添加一个pojo对象, 将pojo对象的所有属性作为参数添加到参数集合中，包含父类属性。如果属性标注{@link Arg}注解，
//     * 则使用注解指定的名称作为参数名称,否则使用属性名称作为参数名称。
//     * @param pojo pojo对象
//     */
//    public void addPojoParameter(Object pojo) {
//        if (pojo == null) {
//            return;
//        }
//        List<Field> fields = ClassUtils.getDeclaredFields(pojo.getClass(), true);
//        for (Field f : fields) {
//            if (Modifier.isStatic(f.getModifiers()) ||
//                    Modifier.isTransient(f.getModifiers())) {
//                continue;
//            }
//            Object value = ClassUtils.getFieldValue(f, pojo);
//            String name = f.getName();
//            Arg arg = f.getAnnotation(Arg.class);
//            if (arg != null && !StringUtils.isBlank(name)) {
//                name = arg.value();
//            }
//            addParameter(name, value);
//        }
//    }
//
//    /**
//     * 设置参数, 如果参数已经存在, 则覆盖参数值
//     * @param key 参数名称
//     * @param value 参数值
//     */
//    public void setParameter(String key, Object... value) {
//        paramMap.remove(key);
//        addParameter(key, value);
//    }
//
//    /**
//     * 将参数集合合并到当前参数集合中
//     * @param params 参数集合
//     */
//    public void putAll(Params params) {
//        paramMap.putAll(params.paramMap);
//    }
//
//    /**
//     * 将参数集合转换为查询字符串，并使用指定的字符集进行URL编码
//     * @param charset 字符集
//     * @return 查询字符串
//     */
//    public String queryString(String charset) {
//        if (paramMap.isEmpty()) {
//            return "";
//        }
//        if (paramMap.size() == 1) {
//            Object[] arr = paramMap.values().iterator().next();
//            Object value = arr[0];
//            if (value != null && !ClassUtils.isPrimitiveOrWrapper(value)) {
//                Params tmp = new Params();
//                tmp.addPojoParameter(value);
//                return tmp.queryString(charset);
//            }
//        }
//        return paramMap.entrySet().stream().map(e -> {
//            String ek = StringUtils.urlEncode(e.getKey(), charset);
//            Object[] arr = e.getValue();
//            if (CollectionUtils.isEmpty(arr)) {
//                return ek + "=";
//            } else {
//                return Arrays.stream(arr).map(o->{
//                    StringBuilder builder = new StringBuilder();
//                    if (o == null) {
//                        builder.append(ek)
//                                .append("=");
//                    } else {
//                        if (o.getClass().isArray()) {
//                            int len = Array.getLength(o);
//                            if (len > 0) {
//                                for (int i = 0; i < len; i++) {
//                                    Object ao = Array.get(o, i);
//                                    builder.append(ek)
//                                            .append("=");
//                                    if (ao != null) {
//                                        builder.append(StringUtils.urlEncode(ao.toString(), charset));
//                                    }
//                                    builder.append("&");
//                                }
//                                builder.setLength(builder.length() - 1);
//                            }
//                        } else if (Collection.class.isAssignableFrom(o.getClass())) {
//                            Collection c = (Collection) o;
//                            if (!c.isEmpty()) {
//                                for (Object oc : c) {
//                                    builder.append(ek)
//                                            .append("=");
//                                    if (oc != null) {
//                                        builder.append(StringUtils.urlEncode(oc.toString(), charset));
//                                    }
//                                    builder.append("&");
//                                }
//                                builder.setLength(builder.length() - 1);
//                            }
//                        } else {
//                            builder.append(ek)
//                                    .append("=")
//                                    .append(StringUtils.urlEncode(o.toString(), charset));
//                        }
//                    }
//                    return builder.toString();
//                }).collect(Collectors.joining("&"));
//            }
//        }).collect(Collectors.joining("&"));
//    }
//
//    /**
//     * 将参数集合转换为对象，如果参数集合只有一个参数，则返回该参数的值，否则返回一个Map对象，key为参数名称，value为参数值。
//     * @return 参数对象
//     */
//    public Object convertToObject() {
//        Map<String, Object[]> map = allParameters();
//        if (CollectionUtils.isEmpty(map)) {
//            return null;
//        }
//        if (map.size() == 1) {
//            return convertArray(map.values().iterator().next());
//        }
//        Map<String, Object> m = new LinkedHashMap<>();
//        for (String key : map.keySet()) {
//            m.put(key, convertArray(map.get(key)));
//        }
//        return m;
//    }
//
//    private Object convertArray(Object[] array) {
//        if (CollectionUtils.isEmpty(array)) {
//            return null;
//        }
//        if (array.length == 1) {
//            return array[0];
//        }
//        return array;
//    }
//
//    @Override
//    public String toString() {
//        return queryString(StandardCharsets.UTF_8.name());
//    }
//}
